home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 26
/
Cream of the Crop 26.iso
/
doom
/
quake.zip
/
TORNADO.ZIP
/
TORNADO.QC
< prev
next >
Wrap
Text File
|
1997-04-30
|
8KB
|
331 lines
//////////////////////////////////////////////////////////
// TORNADO - Version 1.0 //
// 04/30/97 - John Mason //
// jwmason1@ix.netcom.com //
// //
// 1.0 - 04/30/97 - Initial release //
// //
//////////////////////////////////////////////////////////
float fBombLife;
float CycleNum;
float CycleSpeed;
vector RiserOrigin;
void() W_LaunchTornadoBomb;
void() TornadoBombTouch;
void() TornadoBombRiser;
void() TornadoBombTornado;
void() TornadoBombRiserExplode;
void() W_LaunchTornadoBomb =
{
local entity sb_grenade;
fBombLife = 0;
// If player has less than 10 rockets, don't fire Tornado Bomb
if ((self.ammo_rockets < 5) || !(self.weapon & (IT_GRENADE_LAUNCHER | IT_TORNADO_BOMB1 | IT_TORNADO_BOMB2)))
{
sprint(self,"Not enough ammo to launch Tornado Bomb\n");
return;
}
// Subtract 5 rockets from players ammo
self.currentammo = self.ammo_rockets = self.ammo_rockets - 5;
sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
// Set the recoil angle
self.punchangle_x = -5;
// Spawn the grenade - standard id style
sb_grenade = spawn ();
sb_grenade.owner = self;
sb_grenade.movetype = MOVETYPE_BOUNCE;
sb_grenade.solid = SOLID_BBOX;
sb_grenade.classname = "sb_grenade";
// Set the missile speed
makevectors (self.v_angle);
if (self.v_angle_x)
sb_grenade.velocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10;
else
{
sb_grenade.velocity = aim(self, 10000);
sb_grenade.velocity = sb_grenade.velocity * 600;
sb_grenade.velocity_z = 200;
}
sb_grenade.avelocity = '300 300 300';
sb_grenade.angles = vectoangles(sb_grenade.velocity);
sb_grenade.touch = TornadoBombTouch;
// Set Duration
sb_grenade.nextthink = time + 1;
sb_grenade.think = TornadoBombRiser;
setmodel (sb_grenade, "progs/grenade.mdl");
setsize (sb_grenade, '0 0 0', '0 0 0');
setorigin (sb_grenade, self.origin);
};
void() TornadoBombTouch =
{
// Did the grenade hit a someone?
if (other.takedamage)
{
sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
return;
}
else
{
sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
if (self.velocity == '0 0 0')
self.avelocity = '0 0 0';
}
};
void() TornadoBombRiser=
{
local entity sb_riser;
// Make the SBGrenade stop
self.movetype=MOVETYPE_NONE;
self.velocity='0 0 0';
// Draw a tiny explosion (no particles)
setmodel(self, "progs/s_explod.spr");
s_explode1();
sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
// Spawn and animate the 'second stage'
sb_riser = spawn();
sb_riser.owner = self.owner;
sb_riser.movetype = MOVETYPE_BOUNCE;
sb_riser.solid = SOLID_BBOX;
sb_riser.classname = "sb_riser";
// Set speed
sb_riser.velocity = '0 0 25';
sb_riser.avelocity = '250 250 0';
sb_riser.touch = TornadoBombTouch;
// Set Duration
sb_riser.nextthink = time + 0.1;
sb_riser.think = TornadoBombTornado;
setmodel (sb_riser, "progs/grenade.mdl");
setsize (sb_riser, '0 0 0', '0 0 0');
setorigin (sb_riser, self.origin);
RiserOrigin = self.origin;
CycleNum = 1;
CycleSpeed = 1;
fBombLife = 7;
};
void() TornadoBombTornado=
{
local entity head;
local vector vdestdelta;
local float len, traveltime;
local entity missile1, missile2, missile3, missile4, missile5;
T_RadiusDamage (self, self.owner, 5 * (7 - fBombLife), world);
if (fBombLife >= 1)
{
if (CycleNum == 1)
{
vdestdelta_x = RiserOrigin_x + 25000;
vdestdelta_y = RiserOrigin_y;
sound (self, CHAN_WEAPON, "zombie/z_shot1.wav", 1, ATTN_NORM);
}
else if (CycleNum == 2)
{
vdestdelta_x = RiserOrigin_x + 13000;
vdestdelta_y = RiserOrigin_y + 13000;
}
else if (CycleNum == 3)
{
vdestdelta_x = RiserOrigin_x;
vdestdelta_y = RiserOrigin_y + 25000;
}
else if (CycleNum == 4)
{
vdestdelta_x = RiserOrigin_x - 13000;
vdestdelta_y = RiserOrigin_y + 13000;
}
else if (CycleNum == 5)
{
vdestdelta_x = RiserOrigin_x - 25000;
vdestdelta_y = RiserOrigin_y;
}
else if (CycleNum == 6)
{
vdestdelta_x = RiserOrigin_x - 13000;
vdestdelta_y = RiserOrigin_y - 13000;
}
else if (CycleNum == 7)
{
vdestdelta_x = RiserOrigin_x;
vdestdelta_y = RiserOrigin_y - 25000;
}
else if (CycleNum == 8)
{
vdestdelta_x = RiserOrigin_x + 13000;
vdestdelta_y = RiserOrigin_y - 13000;
}
vdestdelta_z = RiserOrigin_z;
len = vlen(vdestdelta);
traveltime = len / CycleSpeed;
if (CycleSpeed <= 32000)
CycleSpeed = CycleSpeed + 10;
self.velocity = vdestdelta * (1/traveltime);
self.velocity_z = 115;
if ((fBombLife <= 6.5) && (TornadoBombMode == 1))
{
// missile1
missile1 = spawn ();
missile1.owner = self;
missile1.movetype = MOVETYPE_BOUNCE;
missile1.solid = SOLID_BBOX;
missile1.velocity = '0 0 0';
missile1.touch = SUB_Null;
missile1.nextthink = time + 1;
missile1.think = SUB_Remove;
setmodel (missile1, "progs/zom_gib.mdl");
setsize (missile1, '0 0 0', '0 0 0');
setorigin (missile1, self.origin);
// missile2
missile2 = spawn ();
missile2.owner = self;
missile2.movetype = MOVETYPE_BOUNCE;
missile2.solid = SOLID_BBOX;
missile2.velocity = '0 0 0';
missile2.touch = SUB_Null;
missile2.nextthink = time + 1;
missile2.think = SUB_Remove;
setmodel (missile2, "progs/zom_gib.mdl");
setsize (missile2, '0 0 0', '0 0 0');
setorigin (missile2, self.origin + '4 0 4');
// missile3
missile3 = spawn ();
missile3.owner = self;
missile3.movetype = MOVETYPE_BOUNCE;
missile3.solid = SOLID_BBOX;
missile3.velocity = '0 0 0';
missile3.touch = SUB_Null;
missile3.nextthink = time + 1;
missile3.think = SUB_Remove;
setmodel (missile3, "progs/zom_gib.mdl");
setsize (missile3, '0 0 0', '0 0 0');
setorigin (missile3, self.origin + '0 4 4');
// missile4
missile4 = spawn ();
missile4.owner = self;
missile4.movetype = MOVETYPE_BOUNCE;
missile4.solid = SOLID_BBOX;
missile4.velocity = '0 0 0';
missile4.touch = SUB_Null;
missile4.nextthink = time + 1;
missile4.think = SUB_Remove;
setmodel (missile4, "progs/zom_gib.mdl");
setsize (missile4, '0 0 0', '0 0 0');
setorigin (missile4, self.origin + '8 0 8');
// missile5
missile5 = spawn ();
missile5.owner = self;
missile5.movetype = MOVETYPE_BOUNCE;
missile5.solid = SOLID_BBOX;
missile5.velocity = '0 0 0';
missile5.touch = SUB_Null;
missile5.nextthink = time + 1;
missile5.think = SUB_Remove;
setmodel (missile5, "progs/zom_gib.mdl");
setsize (missile5, '0 0 0', '0 0 0');
setorigin (missile5, self.origin + '0 8 8');
}
CycleNum = CycleNum + 1;
if (CycleNum >= 9)
CycleNum = 1;
head = findradius(self.origin, 1200);
while (head)
{
self.enemy = head;
if (visible(head))
if ((head.flags & FL_MONSTER) || (head.classname == "player"))
if (head != self.owner)
{
vdestdelta = self.origin - self.enemy.origin;
len = vlen(vdestdelta);
traveltime = len / 500;
self.enemy.flags = self.enemy.flags - (self.enemy.flags & FL_ONGROUND);
self.enemy.velocity = vdestdelta * (1/traveltime);
}
head = head.chain;
}
fBombLife = fBombLife - 0.10;
self.nextthink = time + 0.10;
}
else
{
self.nextthink = time + 0.10;
self.think = TornadoBombRiserExplode;
}
};
void() TornadoBombRiserExplode =
{
T_RadiusDamage (self, self.owner, 150, world);
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_EXPLOSION);
WriteCoord (MSG_BROADCAST, self.origin_x);
WriteCoord (MSG_BROADCAST, self.origin_y);
WriteCoord (MSG_BROADCAST, self.origin_z);
BecomeExplosion ();
};
//////////////////////////////////////////////////////////
// //
// End of TORNADO_BOMB code //
// //
//////////////////////////////////////////////////////////